/* ----------
 * pg_lzcompress.h -
 *
 *	内置 LZ 压缩器的定义
 *
 * src/include/common/pg_lzcompress.h
 * ----------
 */

#ifndef _PG_LZCOMPRESS_H_
#define _PG_LZCOMPRESS_H_


/* ----------
 * PGLZ_MAX_OUTPUT -
 *
 *		计算 pglz_compress() 所需的缓冲区大小的宏。
 *		我们允许在检测到压缩失败之前有 4 个字节的溢出。
 * ----------
 */
#define PGLZ_MAX_OUTPUT(_dlen)			((_dlen) + 4)


/* ----------
 * PGLZ_Strategy -
 *
 *		控制压缩算法的一些值。
 *
 *		min_input_size		考虑压缩的最小输入数据大小。
 *
 *		max_input_size		考虑压缩的最大输入数据大小。
 *
 *		min_comp_rate		要求的最小压缩率（0-99%）。
 *							无论 min_comp_rate 如何，输出必须小于输入，
 *							否则我们不存储压缩数据。
 *
 *		first_success_by	如果在前面这几字节中没有找到可压缩数据，
 *							则放弃压缩。
 *
 *		match_size_good		开始历史查找时的初始良好匹配大小。
 *							在查找历史以找到可以表示为标签的匹配时，
 *							算法并不总是完全回溯。
 *							一个好的快速匹配通常优于一个很晚的最佳匹配。
 *							在查找的每次迭代中，该值都会降低，
 *							因此查找耗时越长，考虑的较小匹配越好。
 *
 *		match_size_drop		在每次历史检查后，match_size_good 降低的百分比。
 *							允许的值是 0（直到结束不更改）到 100（只检查
 *							最新的历史条目）。
 * ----------
 */
typedef struct PGLZ_Strategy
{
	int32		min_input_size;
	int32		max_input_size;
	int32		min_comp_rate;
	int32		first_success_by;
	int32		match_size_good;
	int32		match_size_drop;
} PGLZ_Strategy;


/* ----------
 * 标准策略
 *
 *		PGLZ_strategy_default		TOAST 的推荐默认策略。
 *
 *		PGLZ_strategy_always		尝试压缩任何长度的输入。
 *									仅在输出大于输入时回退到未压缩存储。
 * ----------
 */
extern PGDLLIMPORT const PGLZ_Strategy *const PGLZ_strategy_default;
extern PGDLLIMPORT const PGLZ_Strategy *const PGLZ_strategy_always;


/* ----------
 * 全局函数声明
 * ----------
 */
extern int32 pglz_compress(const char *source, int32 slen, char *dest,
						   const PGLZ_Strategy *strategy);
extern int32 pglz_decompress(const char *source, int32 slen, char *dest,
							 int32 rawsize, bool check_complete);
extern int32 pglz_maximum_compressed_size(int32 rawsize,
										  int32 total_compressed_size);

#endif							/* _PG_LZCOMPRESS_H_ */
